package vip.ola.core.service;

import vip.ola.core.entity.AgentAccount;
import vip.ola.core.entity.AgentInfo;
import vip.ola.core.entity.MchAccount;
import vip.ola.core.entity.SettRecord;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @author: dingzhiwei
 * @date: 18/04/27
 * @description: 代理商账户接口
 */
public interface IAgentAccountService {

    List<AgentAccount> listAll(int offset, int limit);

    AgentAccount findByAgentId(Long agentId);

    int updateSettAmount(long agentId, long totalAmount);

    public BigDecimal sumAgentBalance(AgentAccount record);

    /**
     * 查询总代理下的二级代理余额总和
     */
    BigDecimal sumBalanceByParentAgentId(AgentInfo agentInfo);

    /** 重置今日数据 **/
    void resetTodayAmount();



//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓更改代理商账户余额（ 通过查询查询当前余额，保证当前账户没有发生变化进行更新 ）↓↓↓

    /** 代理商资金增加 **/
    void credit2Account(Long agentId, Byte bizType, Long amount, String bizItem);

    /** 给代理商户加款 **/
    @Deprecated
    void creditToAccount(Long agentId, Long amount, Byte bizType, String bizItem, String orderId);

    /** 给代理商账户冻结金额(增加用户不可用金额) **/
    @Deprecated
    void freezeAmount(Long agentId, Long freezeAmount);

    /** 结算成功给代理商解冻金额并减款(减少账户余额,减少账户不可用金额,减少账户可结算余额) **/
    @Deprecated
    void unFreezeAmount(Long agentId, Long amount, String requestNo, Byte bizType);

    /** 结算失败给代理商账户解冻金额(减少账户不可用金额) **/
    @Deprecated
    void unFreezeSettAmount(Long agentId, Long amount);

    /** 给代理商账户减钱 **/
    @Deprecated
    void debit2Account(Long agentId, Byte bizType, Long amount, String bizItem);

    /** 代理商余额统计 **/
    Map agentCountBalance();

// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓更改商户账户余额（ 采用事务行锁机制 ） ↓↓↓↓↓↓↓↓

    /** 更新代理商余额和safeKey, 返回数据库最新数据Record **/
    AgentAccount updateBalanceAndSafeKey(AgentAccount updateAccount);

    /** 提现业务 处理完成后 处理账户信息 **/
    void changeBalanceAndInsertHistory(SettRecord settRecord);

    /**  通用业务 变更商户账户信息 **/
    void changeBalanceAndInsertHistory(Long agentId, Long changeAmount, Byte bizType, String bizItem, String orderId, Long orderAmount);

    /** 后台调账业务 对通用业务的封装 **/
    void changeBalanceAndInsertHistoryByPlat(Long agentId, Long changeAmount);

    /** 更新代理商不可用余额 **/
    void onlyChangeUnBalance(Long agentId, Long changeUnBalance);


// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑









}
